#ifndef NET_BUS_H_
#define NET_BUS_H_

#include <list>
#include <mutex>
#include "google/protobuf/dynamic_message.h"

class WorkThread;
class Metadata;
/// @brief 网络消息总线
/// 客户端的交互消息通过总线传递，总线根据服务端内部的线程数量作为消息的生存周期（TTL）
/// 新的消息从尾部加入队列，当一条消息（metadata）进入总线，会激发工作线程来读取消息，工作线程遍历所有的内部链识别消息是否需要发送.
/// 一条线程上所有复用的连接对消息识别完成后ttl减一，当ttl为0时将继续从队列头部获取并放入总线.
class NetBus
{
public:
    /// @brief 向总线上注册工作线程
    void Regist(WorkThread *work);
    /// @brief 新消息入列
    void Add(const char *header, int header_size, const char *data, int data_size);
    /// @brief 读取消息
    Metadata *ReadFromHead();
    /// @brief 读取完成，由工作线程调用，连接类不直接调用
    void ReadFinish();

private:
    /// @brief 发送信号e
    void Emit();
    std::list<WorkThread *> work_thread_list_;
    std::list<Metadata *> metadata_list_;
    std::mutex mtx_;
};

#endif